/**
 * axios 二次封装
 */

import axios from 'axios'
import storage from './storage'
import config from '../config'
// import router from '../router';

const TOKEN_INVSLID = 'Token认证失败，请重新登录'
const NETWORK_ERROR = '网络请求异常，请稍后重试'

// 初始化接口地址
config.initEnvConfig()

const envKey = config.envKey
// TODO: 因为还是走了一个异步请求, 所以在获取第一次存储的地址时, 存在拿不到的情况
// const envConfig = storage.getItem('envConfig');

// 创建 axios 实例对象，添加全局配置
const service = axios.create({
	// baseURL: process.env.BACKEND_ONE_URL,
	// baseURL: envConfig[envKey[0]],
	timeout: 8000,
})
// 请求拦截
service.interceptors.request.use((req) => {
	// TODO
	const headers = req.headers
	if (!headers.Authorization) {
		headers.Authorization = 'Bear Jack'
	}
	return req
})

// 响应拦截
service.interceptors.response.use((res) => {
	const { code, data, msg = NETWORK_ERROR } = res.data
	if (code === 200) {
		return data
	} else {
		return Promise.rejectj({ code, msg, data })
	}
})

/**
 * 请求核心函数
 * @param {Object} options 请求配置
 */
const request = (options) => {
	if (service.defaults.baseURL === undefined) {
		// 第一次的请求配置
		const baseURL = storage.getItem('envConfig')[envKey[0]]
		service.defaults.baseURL = baseURL
	}

	// 默认使用 GET 请求
	options.method = options.method || 'get'

	// 转小写做判断
	if (options.method.toLowerCase() === 'get') {
		options.params = options.data
	}

	// 通过接口请求参数来切换请求地址
	if (options.isChange === true) {
		const baseURL = storage.getItem('envConfig')[envKey[options.changeIndex || 0]]
		service.defaults.baseURL = baseURL
	}

	console.log(service.defaults.baseURL)

	return service(options)
}

// 给函数绑上几个基础的请求方法
;['get', 'post', 'put', 'delete', 'patch'].forEach((method) => {
	request[method] = (url, data, options) => {
		return request({
			url,
			method,
			data,
			...options,
		})
	}
})

export default request
